/**
 *
 *  Copyright (c) 2011, AstroDAbis
 *  All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without modification,
 *  are permitted provided that the following conditions are met:
 *
 *      * Redistributions of source code must retain the above copyright notice,
 *        this list of conditions and the following disclaimer.
 *      * Redistributions in binary form must reproduce the above copyright notice,
 *        this list of conditions and the following disclaimer in the documentation
 *        and/or other materials provided with the distribution.
 *
 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 *  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 *  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 *  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
 *  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
 *  OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 *  OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 */
package org.jiscinvolve.astrodabis.barberry.control.qrcode;

import java.util.Hashtable;

import java.awt.image.BufferedImage;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.context.request.WebRequest;

import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ModelAttribute;

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.http.MediaType;

import com.google.zxing.Writer;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;

import com.google.zxing.client.j2se.MatrixToImageWriter;

import org.jiscinvolve.astrodabis.barberry.control.Paths;
import org.jiscinvolve.astrodabis.barberry.control.ObjectData;
import org.jiscinvolve.astrodabis.barberry.control.RequestData;
import org.jiscinvolve.astrodabis.barberry.control.BaseController;

import org.jiscinvolve.astrodabis.barberry.common.core.Account;

import org.jiscinvolve.astrodabis.barberry.common.core.Identifier;
import org.jiscinvolve.astrodabis.barberry.common.core.Identified;
import org.jiscinvolve.astrodabis.barberry.common.core.SimpleIdent;

import org.jiscinvolve.astrodabis.barberry.common.core.exception.*;

/**
 * Generate QRCode image for objects in our system.
 * http://code.google.com/p/zxing/
 *
 */
@Controller
@RequestMapping("/**/qrcode")
public class QRCodeController
extends BaseController
    {

    /**
     * Our debug logger.
     * 
     */
    private static Log log = LogFactory.getLog(QRCodeController.class);

    /**
     * Initialise the PJA (Pure Java AWT) Toolkit.
     * 
     */
    static {
        try {
            log.debug("Initialising headless");
            System.setProperty ("java.awt.headless", "true");
            log.debug("Initialising PJAToolkit");
            System.setProperty ("awt.toolkit", "com.eteks.awt.PJAToolkit");
            }
        catch (Exception ouch)
            {
            log.error("Failed to initialise PJAToolkit [" + ouch.getClass().getName() + "][" + ouch.getMessage() + "]");
            }
        }

    /**
     * Generate the QRCode image.
     * 
     */
    @ResponseBody
	@RequestMapping(method=RequestMethod.GET)
	public void process(
	    HttpServletRequest  request,
        HttpServletResponse response
	    ){
//        log.debug("QRCodeController.process(....)");

        StringBuffer buffer = request.getRequestURL();

        String target = buffer.substring(
            0,
            buffer.lastIndexOf(
                Paths.QRCODE_PATH
                )
            );

//        log.debug("  Request [" + buffer + "]");
//        log.debug("  Target  [" + target + "]");

//
// Special case for the home page.
// Don't remove the '/'

        try {

            Hashtable hints = new Hashtable();

            QRCodeWriter writer = new QRCodeWriter();

            BitMatrix matrix = writer.encode(
                target,
                BarcodeFormat.QR_CODE,
                100,
                100,
                hints
                ); 

            response.setContentType(
                "image/png"
                );

            MatrixToImageWriter.writeToStream(
                matrix,
                "PNG",
                response.getOutputStream()
                );
            }

        catch (Exception ouch)
            {
            log.debug("Exception processing QRCode response [" + ouch.getMessage() + "]");
            log.debug(ouch);
            }
        }
    }




